<?php
/**
 * 태그 생성을 위한 클래스 
 *
 * @package php.lang
 */

/**
 * Tag를 만들기 위한 class
 *
 * @version	1.0
 * @since	php5 or later 
 * @package php.lang 
 *
 */
class Tag extends PObject {
	/**
	 * Tag 이름
	 *
	 * @var		string
	 *
	 */
	protected $tag;

	/**
	 * Two 태그 여부
	 *
	 * @var		boolean		true : Two 태그, false : One 태그 
	 *
	 */
	protected $hasClose;

	/**
	 * 속성 리스트 
	 *
	 * @var		array
	 *
	 */
	protected $attribute = array();

	/**
	 * 스타일 리스트 
	 *
	 * @var		array
	 *
	 */
	protected $style = array();

	/**
	 * data 리스트 
	 *
	 * @var		array
	 *
	 */
	protected $data = array();

	/**
	 * 생성자
	 *
	 * @param	string $tag	태그 이름 
	 * @param	boolean $close	Two 태그 여부
	 *
	 */
	public function __construct($tag, $close = false)
	{
		$this->tag = strtolower($tag);
		$this->hasClose = $close;
	}
	
	public function __call($method, $args) { 
		$string = array_shift($args);
		
		return $this->add(x_($method)->add($string));
	}

	/**
	 * 스타일 추가하기 
	 *
	 * @param	string	$key	스타일 이름
	 * @param	string	$value	스타일 값
	 *
	 */
	public function addStyle($key,  $value)
	{
		$this->style[$key] = "$key : $value";

		return $this;
	}

	/**
	 * 스타일 배열로 추가하기 
	 *
	 *  <code>$obj->setStyle(array('width'=>'100px', 'height' =>'100px'));</code>
	 *
	 * @param	array	$arr	스타일 리스트 
	 * @return	object
	 */
	public function setStyle($arr)
	{
		foreach ($arr as $key => $value) {
			$this->addStyle($key, $value);
		}

		return $this;
	}


	/**
	 * 스타일 문자열로 모으기 
	 *
	 * @return	string 
	 */
	protected function collectStyle()
	{
		return implode(";", $this->style);

	}

	/**
	 * 속성 추가하기 
	 *
	 * @param	string	$key	속성 이름
	 * @param	string	$value	속성 값
	 * @return	object 
	 */
	public function addAttribute($key, $value)
	{
		$this->attribute[$key] = " $key='$value'";

		return $this;
	}

	/**
	 * 속성 배열로 추가하기 
	 *
	 *  <code>$obj->setAttribute(array('width'=>'100px', 'height' =>'100px'));</code>
	 *
	 * @param	array	$arr	속성 리스트
	 * @return	void
	 */
	public function setAttribute($arr) {
		foreach ($arr as $key => $attr) {
			$this->addAttribute($key, $attr);
		}

		return $this;
	}

	/**
	 * 속성 문자열로 모으기 
	 *
	 * @return	string 
	 */
	public function collectAttribute()
	{
		return implode(" ", $this->attribute);
	}

	/**
	 * 데이타 추가하기, 데이타틑 PObject를 상속하는 클래스부터 일반 자료형 모두를 포함한다.
	 *
	 * @param	mixed $obj	php 모든 자료형 
	 * @return	object 		Tag 객체 자신 (this)
	 */
	public function add($obj) {
		$this->data[] = PObject::getObjValue($obj);

		return $this;
	}

	/**
	 * 문자열 변환
	 *
	 * @return	string
	 */
	public function toString()
	{

		$str = "<{$this->tag}";

		if ($temp = $this->collectAttribute()) {
			$str .= " $temp ";
		}

		if ($temp = $this->collectStyle()) {
			 $str .= " style=\"$temp\"";
		}

		// one tag 
		if ($this->hasClose) {

			$str .= ">";
			
			if (count($this->data) > 0 ) {
				$str .= implode("", $this->data);
			}
			
			$str .= "</{$this->tag}>\n";
		}	
		// two tag 
		else {


			$str .= "/>\n";
		}

		return $str;
	}
}

?>